﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using dao.commons;
using Microsoft.SqlServer.Server;
using negocio.readOnly;
using negocio.entidades;
using System.Data;
using System.Data.SqlClient;
using dao.daos;

namespace negocio.servicios
{
    public class ProductoService
    {

        public bool Insertar(Producto prod)
        {
            ProductoDao datos = new ProductoDao();
            bool exito = false;
            if (datos.ExisteCod(prod.Codigo) == false)
            {
                string valores = GenerarStringValores(prod);
                datos.Insertar(valores);
                exito = true;
            }
            return exito;

        }

        public void Eliminar(Producto prod)
        {
            ProductoDao datos = new ProductoDao();
            datos.Eliminar(prod.Id);
        }

        public void modificar(Producto p)
        {
            ProductoDao datos = new ProductoDao();
            string valores = GenerarStringValores(p);
            string restriccion = string.Format("ID_PRODUCTO = {0}", p.Id);
            datos.Modificar(valores, restriccion);

        }


        public Producto ontenerProductoPorId(int id)
        {
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.ObtenerPorId(id);
            Producto prod = new Producto();

            if (dr != null)
            {
                dr.Read();
                prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                prod.Codigo = dr["CODIGO"].ToString();
                prod.IdPoveedor = int.Parse(dr["ID_PROVEEDOR"].ToString());
                prod.TipoProd = dr["TIPO_PRODUCTO"].ToString();
                if (dr["ID_TIPO_TELA"] != DBNull.Value)
                    prod.IdTipoTela = int.Parse(dr["ID_TIPO_TELA"].ToString());
                if (dr["STOCK_MINIMO"] != DBNull.Value)
                    prod.StockMinimo = int.Parse(dr["STOCK_MINIMO"].ToString());
                prod.Stock = int.Parse(dr["STOCK"].ToString());
                prod.Descripcion = dr["DESCRIPCION"].ToString();
                prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());
                prod.PrecioCosto = double.Parse(dr["PRECIO_COSTO"].ToString());
                prod.FechaAlta = (DateTime)dr["FECHA_ALTA"];
                
   
            }
            return prod;
        }

        public List<ProductoReadOnly> FindAllReadOnlies(bool conBajas)
        {
            List<ProductoReadOnly> lista = new List<ProductoReadOnly>();
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.ObtenerTodosColumnas(conBajas);
            while (dr.Read())
            {
                ProductoReadOnly prod = new ProductoReadOnly();

                prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                prod.Codigo = dr["CODIGO"].ToString();
                prod.TipoProd = dr["TIPO_PRODUCTO"].ToString();
                if (dr["NOMBRE"] != DBNull.Value)
                {
                    prod.TipoTela = dr["NOMBRE"].ToString();
                }
                else
                {
                    prod.TipoTela = " ";
                }
                if (dr["STOCK_MINIMO"] != DBNull.Value)
                    prod.StockMinimo = int.Parse(dr["STOCK_MINIMO"].ToString());
                prod.Stock = int.Parse(dr["STOCK"].ToString());
                prod.Descripcion = dr["DESCRIPCION"].ToString();
                prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());
                prod.PrecioCosto = double.Parse(dr["PRECIO_COSTO"].ToString());
                prod.FechaAlta = Convert.ToDateTime(dr["FECHA_ALTA"]).ToShortDateString();
                prod.DadoBaja = bool.Parse(dr["DADO_BAJA"].ToString());

                lista.Add(prod);

            }
            return lista;
        }

        public List<ProductoReadOnly> FindAllReadOnliesProv(int idProv)
        {
            List<ProductoReadOnly> lista = new List<ProductoReadOnly>();
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.obtenerPorProveedor(idProv);
            while (dr.Read())
            {
                ProductoReadOnly prod = new ProductoReadOnly();

                prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                prod.Codigo = dr["CODIGO"].ToString();
                prod.TipoProd = dr["TIPO_PRODUCTO"].ToString();
                if (dr["NOMBRE"] != DBNull.Value)
                {
                    prod.TipoTela = dr["NOMBRE"].ToString();
                }
                else
                {
                    prod.TipoTela = " ";
                }
                if (dr["STOCK_MINIMO"] != DBNull.Value)
                    prod.StockMinimo = int.Parse(dr["STOCK_MINIMO"].ToString());
                prod.Stock = int.Parse(dr["STOCK"].ToString());
                prod.Descripcion = dr["DESCRIPCION"].ToString();
                prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());
                prod.PrecioCosto = double.Parse(dr["PRECIO_COSTO"].ToString());
                //prod.FechaAlta = dr["FECHA_ALTA"].ToString();
                prod.FechaAlta = Convert.ToDateTime(dr["FECHA_ALTA"]).ToShortDateString();
                prod.DadoBaja = bool.Parse(dr["DADO_BAJA"].ToString());

                lista.Add(prod);

            }
            return lista;
        }


        private string GenerarStringValores(Producto prod)
        {
            string valores =
                string.Format(
                    "CODIGO ={0}, ID_PROVEEDOR ={1}, TIPO_PRODUCTO ={2}",

                    prod.Codigo.ToString(),
                    prod.IdPoveedor.ToString(),
                    prod.TipoProd.ToString());
            if (prod.IdTipoTela != null)
            {
                valores += string.Format(", ID_TIPO_TELA ={0}",
                prod.IdTipoTela.ToString());
            }


            if (prod.StockMinimo != null)
            {
                valores += string.Format(", STOCK_MINIMO = {0}",
                prod.StockMinimo.ToString());
            }

            valores += string.Format(", STOCK ={0}, DESCRIPCION ={1}, PRECIO_VENTA ={2}, PRECIO_COSTO= {3}, FECHA_ALTA ={4}, DADO_BAJA ={5}",
                        prod.Stock.ToString(),
                        prod.Descripcion.ToString(),
                        prod.PrecioVenta.ToString(),
                        prod.PrecioCosto.ToString(),
                        prod.FechaAlta.ToString(),
                        (prod.DadoBaja ? 1 : 0)
                        );

            return valores;
        }

        public List<TipoTela> cargarComboTipoTela()
        {
            TipoTelaDao datos = new TipoTelaDao();
            SqlDataReader dr = datos.ObtenerTodo();
            List<TipoTela> lista = new List<TipoTela>();

            while (dr.Read())
            {
                TipoTela tt = new TipoTela();
                tt.Id = int.Parse(dr["ID_TIPO_TELA"].ToString());
                tt.Nombre = dr["NOMBRE"].ToString();

                lista.Add(tt);
            }

            return lista;
        }

        public List<Proveedor> cargarComboProveedor()
        {
            ProveedorDao datos = new ProveedorDao();
            SqlDataReader dr = datos.obtenerDatosParaCombo();
            List<Proveedor> lista = new List<Proveedor>();

            while (dr.Read())
            {
                Proveedor prov = new Proveedor();
                prov.IdProveedor = int.Parse(dr["ID_PROVEEDOR"].ToString());
                prov.RazonSocial = dr["RAZON_SOCIAL"].ToString();

                lista.Add(prov);
            }

            return lista;
        }


        public List<ProductoReadOnly> buscar(string filtro, bool conBajas)
        {
            List<ProductoReadOnly> lista = new List<ProductoReadOnly>();
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.ObtenerPorNombre(filtro, conBajas);
            if (dr != null)
            {
                while (dr.Read())
                {
                    ProductoReadOnly prod = new ProductoReadOnly();

                    prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                    prod.Codigo = dr["CODIGO"].ToString();
                    prod.TipoProd = dr["TIPO_PRODUCTO"].ToString();
                    if (dr["NOMBRE"] != DBNull.Value)
                        prod.TipoTela = dr["NOMBRE"].ToString();
                    if (dr["STOCK_MINIMO"] != DBNull.Value)
                        prod.StockMinimo = int.Parse(dr["STOCK_MINIMO"].ToString());
                    prod.Stock = int.Parse(dr["STOCK"].ToString());
                    prod.Descripcion = dr["DESCRIPCION"].ToString();
                    prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());
                    prod.PrecioCosto = double.Parse(dr["PRECIO_COSTO"].ToString());
                    prod.FechaAlta = Convert.ToDateTime(dr["FECHA_ALTA"]).ToShortDateString();

                    lista.Add(prod);
                }
            }
            return lista;
        }

        public IList<ProductoForCompraReadOnly> ObtenerReadOnliesPorPedido(int idPedido)
        {
            List<ProductoForCompraReadOnly> lista = new List<ProductoForCompraReadOnly>();
            ProductoDao dao = new ProductoDao();
            SqlDataReader dr = dao.ObtenerPorPedido(idPedido);
            while (dr.Read())
            {
                ProductoForCompraReadOnly prod = new ProductoForCompraReadOnly();

                prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                prod.Codigo = dr["CODIGO"].ToString();
                prod.TipoProd = dr["TIPO_PRODUCTO"].ToString();
                prod.TipoTela = SafeReader.GetSafeString(dr, "NOMBRE");
                prod.StockMinimo = SafeReader.GetSafeInt(dr, "STOCK_MINIMO");
                prod.Stock = int.Parse(dr["STOCK"].ToString());
                prod.Descripcion = dr["DESCRIPCION"].ToString();
                prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());
                prod.PrecioCosto = double.Parse(dr["PRECIO_COSTO"].ToString());
                prod.Cantidad = SafeReader.GetSafeInt(dr, "CANTIDAD");
                lista.Add(prod);
            }
            return lista;
        }

        public List<ProductoReadOnly> buscarPorFiltroYProv(string filtro, int idProv)
        {
            List<ProductoReadOnly> lista = new List<ProductoReadOnly>();
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.obtenerPorNombreYProv(filtro, idProv);
            if (dr != null)
            {
                while (dr.Read())
                {
                    ProductoReadOnly prod = new ProductoReadOnly();

                    prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                    prod.Codigo = dr["CODIGO"].ToString();
                    prod.TipoProd = dr["TIPO_PRODUCTO"].ToString();
                    if (dr["NOMBRE"] != DBNull.Value)
                        prod.TipoTela = dr["NOMBRE"].ToString();
                    if (dr["STOCK_MINIMO"] != DBNull.Value)
                        prod.StockMinimo = int.Parse(dr["STOCK_MINIMO"].ToString());
                    prod.Stock = int.Parse(dr["STOCK"].ToString());
                    prod.Descripcion = dr["DESCRIPCION"].ToString();
                    prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());
                    prod.PrecioCosto = double.Parse(dr["PRECIO_COSTO"].ToString());
                    //prod.FechaAlta = (DateTime)dr["FECHA_ALTA"];
                    prod.FechaAlta = dr["FECHA_ALTA"].ToString();
                    lista.Add(prod);
                }
            }
            return lista;
        }

        public List<ProductoVentaReadOnly> obtenerProdParaListado(string cod, int tela)
        {
            List<ProductoVentaReadOnly> lista = new List<ProductoVentaReadOnly>();
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.obtenerPorNombreYTela(cod, tela);
            while (dr.Read())
            {
                ProductoVentaReadOnly prod = new ProductoVentaReadOnly();

                prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                prod.Codigo = dr["CODIGO"].ToString();
                if (dr["NOMBRE"] != DBNull.Value)
                {
                    prod.TipoTela = dr["NOMBRE"].ToString();
                }
                else
                {
                    prod.TipoTela = " ";
                }
                prod.Stock = int.Parse(dr["STOCK"].ToString());
                prod.Descripcion = dr["DESCRIPCION"].ToString();
                prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());

                lista.Add(prod);

            }
            return lista;
        }
    }
}
